﻿#include"Sort.h"

void PrintSort(int* a, int n)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}
void Swap(int* p1, int* p2)
{
	int tmp = *p1;
	*p1 = *p2;
	*p2 = tmp;
}

//有n个数
//下标是0~n-1

//void BubbleSort(int* a, int n)
//{
	//两种写法
	//一趟
	//写法1
	//for (int i = 0; i < n-1; i++)
	//{
	//	if (a[i] > a[i + 1])//i=n-1就越界了
	//	{
	//		Swap(&a[i], &a[i + 1]);
	//	}
	//}
	////写法2
	//for (int i = 1; i < n; i++)
	//{
	//	if (a[i - 1] > a[i])//i=n-1没有越界，
	//	{
	//		Swap(&a[i - 1], &a[i]);
	//	}
	//}
	////整体
	//for (int j = 0; j < n; j++)
	//{
	//	//一趟
	//	for (int i = 0; i < n - 1-j; i++)//i要从第一个开始交换
	//	{
	//		if (a[i] > a[i + 1])//i=n-1就越界了
	//		{
	//			Swap(&a[i], &a[i + 1]);
	//		}
	//	}
	//}

	//for (int j = 0; j < n; j++)
	//{
	//	for (int i = 1; i < n-j; i++)
	//	{
	//		if (a[i - 1] > a[i])//i=n-1没有越界，
	//		{
	//			Swap(&a[i - 1], &a[i]);
	//		}
	//	}
	//}
//}



//void BubbleSort(int* a, int n)
//{
//	for (int j = 0; j < n; j++)
//	{
//		//一趟
//		bool exchange = false;
//		for (int i = 0; i < n - 1 - j; i++)//i要从第一个开始交换
//		{
//			if (a[i] > a[i + 1])//i=n-1就越界了
//			{
//				Swap(&a[i], &a[i + 1]);
//				exchange = true;
//			}
//		}
//		if (exchange == false)
//		{
//			break;
//		}
//    }
//}


////升序
//void InsertSort(int* a, int n)
//{
//	//[0,end]end+1插入
//	for (int i = 0; i < n - 1; i++)
//	{
//		int end=i;
//		int tmp = a[end + 1];
//		while (end >= 0)
//		{
//			if (a[end] > tmp)
//			{
//				a[end + 1] = a[end];
//				end--;
//			}
//			else//<=
//			{
//				break;
//			}
//		}
//		a[end + 1] = tmp;
//	}
//}

//////升序
//////写法1：三层嵌套循环
//void ShellSort(int* a, int n)
//{
//	//多组
//	int gap = 3;
//	for (int j = 0; j < gap; j++)
//	{
//		//每组
//		for (int i = j; i < n - gap; i += gap)
//		{
//			int end = i;
//			int tmp = a[end + gap];
//			//一趟
//			while (end >= 0)
//			{
//				if (a[end] > tmp)
//				{
//					a[end + gap] = a[end];
//					end -= gap;
//				}
//				else//<=
//				{
//					break;
//				}
//			}
//			a[end + gap] = tmp;
//		}
//	}
//}


//写法2
//多组并排
//void ShellSort(int* a, int n)
//{
//	//整体
//	int gap = n;
//	while (gap > 1)
//	{
//		//每组
//		//gap = gap / 2;
//		gap = gap / 3 + 1;
//		for (int i = 0; i < n - gap; i++)
//		{
//			int end = i;
//			int tmp = a[end + gap];
//			//一趟
//			while (end >= 0)
//			{
//				if (a[end] > tmp)
//				{
//					a[end + gap] = a[end];
//					end -= gap;
//				}
//				else//<=
//				{
//					break;
//				}
//			}
//			a[end + gap] = tmp;
//		}
//	}
//}

void SelectSort(int* a, int n)
{
	int begin = 0;
	int end = n - 1;
	int maxi = begin;
	int mini = begin;
	while (begin < end)
	{
		//遍历区间在[begin,end]
		for (int i = begin; i <= end; i++)
		{
			if (a[i] < a[mini])
			{
				mini = i;
			}
			if (a[i] > a[maxi])
			{
				maxi = i;
			}
			//>=/<=不换
		}
		Swap(&a[mini], &a[begin]);
		if (a[maxi] == a[begin])
		{
			maxi = mini;
		}
		Swap(&a[maxi], &a[end]);
		begin++;
		end--;
	}
}


//Adjustdown(php->a, php->size, 0);
//向下调整
void Adjustdown(int * a, int size, int parent)
{
	//假设法
	int child = parent * 2 + 1;
	while (child < size)
	{
		if (child + 1 < size && a[child + 1] < a[child])//注意❗
		{
			child++;
		}
		//比较
		if (a[child] < a[parent])
		{
			//交换
			Swap(&a[child], &a[parent]);
			parent = child;
			child = child * 2 + 1;
		}
		else//>=
		{
			break;
		}
	}
}
void HeapSort(int* a, int size)
{
	//1.向下调整建堆
	for (int i = (size - 1 - 1) / 2; i >= 0; i--)
	{
		Adjustdown(a, size, i);
	}
	//2.
	while (size)
	{
		//交换
		Swap(&a[0], &a[size - 1]);
		//向下调整(除去已经排序好的元素）
		Adjustdown(a, size - 1, 0);
		//到达下一个交换的位置
		size--;
	}
}